package br.com.funaction.eventtcontrollerv2.controller;

import java.io.IOException;
import java.sql.SQLException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.primefaces.model.chart.CartesianChartModel;  
import org.primefaces.model.chart.LineChartSeries;

import br.com.funaction.eventtcontrollerv2.entities.Franquia;
import br.com.funaction.eventtcontrollerv2.entities.PDV;
import br.com.funaction.eventtcontrollerv2.model.PDVDAO;
import br.com.funaction.eventtcontrollerv2.model.VisaoGeralDAO;

@RequestScoped
@ManagedBean
public class VisaoGeralMB {
	
	PDV pdv = new PDV();
	PDVDAO pdvDAO = new PDVDAO();
	Franquia franquia = new Franquia();
	FacesContext contexto = FacesContext.getCurrentInstance();
	VisaoGeralDAO visaoGeralDAO = new VisaoGeralDAO();
	
	private List<PDV> listaPDV;
	private CartesianChartModel linear;
	private int totalEspacoAlocado;
	private int totalEspacoDisponivel;
	private int totalRecebimento = 0;
	private int totalPagamento = 0;
	private int totalRecebimentoMesAtual;
	private int totalPagamentoMesAtual;

	@PostConstruct
	public void init(){
		
		try{
			
			autenticacao();
			
		} catch(Exception e){
			
			this.franquia.setId(1);
		}
		
		try{
			
			listaTudoPDV();
			
		} catch(Exception e){
			
		}
		
		try{
			
			buscaEspaco();
			
		} catch(Exception e){
			
		}
		
		try{
			
			criaGraficoLinear();
			
		} catch(Exception e){
			
		}
	}
	
	private void autenticacao() throws IOException{
		
		franquia = (Franquia) contexto.getExternalContext().getSessionMap().get("franquia");
		if(franquia == null){
			
			ExternalContext contextoExterno = contexto.getExternalContext();
			contextoExterno.redirect("/eventt-controller-v2/jsf/login/login.jsf");
			return;
		}
		pdv.setIdFranquia(franquia.getId());
	}
	
	private void listaTudoPDV() throws SQLException{
		
		listaPDV = pdvDAO.listaTudoPDVVisaoGeral(pdv);
	}
	
	private void criaGraficoLinear() throws SQLException{
		
		linear = new CartesianChartModel();
		Date dataAtual = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(dataAtual);
		int mes = (calendar.get(Calendar.MONTH) + 1); //janeiro = 0, entao add mais um
		int ano = calendar.get(Calendar.YEAR);
		String dataInicial = "";
		String dataFinal = "";
		String mesAno = "";
		
		LineChartSeries recebimentos = new LineChartSeries();
		recebimentos.setLabel("Recebimentos");
		
		
		for(int i=0; i<6; i++){
			
			if(i == 0){
				
				dataInicial = ano + "/" + mes + "/01";
				dataFinal = ano + "/" + mes + "/31";
				
				totalRecebimento = visaoGeralDAO.totalAnuncioMes(dataInicial, dataFinal, franquia.getId());
				totalRecebimentoMesAtual = totalRecebimento;
				
				mesAno = mes + "/" + ano;
				recebimentos.set(mesAno, totalRecebimento);
				
			} else{
				
				dataInicial = ano + "/" + (mes + i) + "/01";
				dataFinal = ano + "/" + (mes + i) + "/31";
				
				totalRecebimento = visaoGeralDAO.totalAnuncioMes(dataInicial, dataFinal, franquia.getId());
				
				mesAno = (mes + i) + "/" + ano;
				recebimentos.set(mesAno, totalRecebimento);
			}
		}
		
		LineChartSeries pagamentos = new LineChartSeries();
		pagamentos.setLabel("Pagamentos");
		
		for(int i=0; i<6; i++){
			
			if(i == 0){
				
				dataInicial = ano + "/" + mes + "/01";
				dataFinal = ano + "/" + mes + "/31";
				
				totalPagamento = visaoGeralDAO.totalPagamentoMes(dataInicial, dataFinal, franquia.getId());
				totalPagamentoMesAtual = totalPagamento;
				
				mesAno = mes + "/" + ano;
				pagamentos.set(mesAno, totalPagamento);
				
			} else{
				
				dataInicial = ano + "/" + (mes + i) + "/01";
				dataFinal = ano + "/" + (mes + i) + "/31";
				
				totalPagamento = visaoGeralDAO.totalPagamentoMes(dataInicial, dataFinal, franquia.getId());
				
				mesAno = (mes + i) + "/" + ano;
				pagamentos.set(mesAno, totalPagamento);
			}
		}
		
		linear.addSeries(recebimentos);
		linear.addSeries(pagamentos);
	}
	
	private void buscaEspaco() throws SQLException{
		
		Date dataAtual = new Date();
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(dataAtual);
		int mes = (calendar.get(Calendar.MONTH) + 1); //janeiro = 0, entao add mais um
		int ano = calendar.get(Calendar.YEAR);
		String dataInicial = ano + "/" + (mes) + "/01";
		String dataFinal = ano + "/" + (mes) + "/31";
		
		totalEspacoAlocado = visaoGeralDAO.totalEspacoAlocado(dataInicial, dataFinal, franquia.getId());
		totalEspacoDisponivel = (visaoGeralDAO.totalEspacoDisponivel(dataInicial, dataFinal, franquia.getId()) * 25);
	}
	
	public List<PDV> getListaPDV() {
		return listaPDV;
	}

	public void setListaPDV(List<PDV> listaPDV) {
		this.listaPDV = listaPDV;
	}

	public CartesianChartModel getLinear() {
		return linear;
	}

	public void setLinear(CartesianChartModel linear) {
		this.linear = linear;
	}

	public int getTotalEspacoAlocado() {
		return totalEspacoAlocado;
	}

	public void setTotalEspacoAlocado(int totalEspacoAlocado) {
		this.totalEspacoAlocado = totalEspacoAlocado;
	}

	public int getTotalEspacoDisponivel() {
		return totalEspacoDisponivel;
	}

	public void setTotalEspacoDisponivel(int totalEspacoDisponivel) {
		this.totalEspacoDisponivel = totalEspacoDisponivel;
	}

	public int getTotalRecebimento() {
		return totalRecebimento;
	}

	public void setTotalRecebimento(int totalRecebimento) {
		this.totalRecebimento = totalRecebimento;
	}

	public int getTotalPagamento() {
		return totalPagamento;
	}

	public void setTotalPagamento(int totalPagamento) {
		this.totalPagamento = totalPagamento;
	}

	public int getTotalRecebimentoMesAtual() {
		return totalRecebimentoMesAtual;
	}

	public void setTotalRecebimentoMesAtual(int totalRecebimentoMesAtual) {
		this.totalRecebimentoMesAtual = totalRecebimentoMesAtual;
	}

	public int getTotalPagamentoMesAtual() {
		return totalPagamentoMesAtual;
	}

	public void setTotalPagamentoMesAtual(int totalPagamentoMesAtual) {
		this.totalPagamentoMesAtual = totalPagamentoMesAtual;
	}
}